﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
using System.Data;
using System.Globalization;

namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para FRMdevcuero.xaml
    /// </summary>
    public partial class FRMdevcuero : Window
    {

      
        public FRMdevcuero()
        {
            InitializeComponent();
              devcuero.Instance.consSemFec();
        }

        private void butGua_Click(object sender, RoutedEventArgs e)
        {
            devcuero.Instance.guardar(wPnot);
            
        }

        private void Window_Closed(object sender, EventArgs e)
        {
            devcuero.Instance = null;
        }

        private void datDevCue_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter && elemento != null)
            {
                e.Handled = true;
                elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.F3 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta == true) { MDOgeneral.logBusquedadAbierta = false; }
            }

            if (e.Key == Key.F4 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta1 == true) { MDOgeneral.logBusquedadAbierta1 = false; }
            }

            if (e.Key == Key.F5 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta2 == true) { MDOgeneral.logBusquedadAbierta2 = false; }
            }
        }

    }

 public class devcuero:ObservableObject
 {

     private static devcuero instance = null;

     protected devcuero()
     {
         MDOgeneral.conectar();
         strTituloVentana = "Devolución de cuero - Usuario: " + MDOgeneral.usuario + " - [FRMdevcuero]";
     }

     public static devcuero Instance
     {
        get
        {
        if (instance == null)
            instance = new devcuero();
           return instance;
         }
       set { 
          if (instance != null)
            instance = null;
         }
     }

     private string _strTituloVentana;
     public string strTituloVentana
     {
         get { return _strTituloVentana; }
         set { _strTituloVentana = value; RaisePropertyChangedEvent("strTituloVentana"); }
     }

     private int _semana;
     public int semana {
         get { return _semana; }
         set { _semana = value;
         RaisePropertyChangedEvent("semana");
         }
     }

     private string _orden;
     public string orden
     {
         get { return _orden; }
         set
         {
             _orden = value;
             if (!String.IsNullOrEmpty(_orden)) {
                 consultar();
             }

             RaisePropertyChangedEvent("orden");
         }
     }

     private Boolean _ERROR = false;
     public Boolean ERROR {
         get { return _ERROR; }
         set { _ERROR = value;
         RaisePropertyChangedEvent("ERROR");
         }     
     }

     private Boolean _CAMBIO = false;
     public Boolean CAMBIO
     {
         get { return _CAMBIO; }
         set
         {
             _CAMBIO = value;
             RaisePropertyChangedEvent("CAMBIO");
         }
     }

     private DateTime _desde;
     public DateTime desde {
         get { return _desde; }
         set { _desde = value;
         RaisePropertyChangedEvent("desde");
         }
     }

     private DateTime _hasta;
     public DateTime hasta {
         get { return _hasta; }
         set { _hasta = value;
         RaisePropertyChangedEvent("hasta");
         }
     }

     private DateTime _fecrep = DateTime.Today;
     public DateTime fecrep {
         get { return _fecrep; }
         set { _fecrep = value;
         RaisePropertyChangedEvent("fecrep");
         }
     }
     
     private ObservableCollection<devorden> _lisDevorden = new ObservableCollection<devorden>();
     public ObservableCollection<devorden> lisDevorden {
         get { return _lisDevorden; }
         set {
             _lisDevorden = value;
             RaisePropertyChangedEvent("lisDevorden");         
         }
     }

     private int _indexsel;
     public int indexsel{
         get { return _indexsel; }
         set { _indexsel = value;
         RaisePropertyChangedEvent("indexsel");
         }     
     }

     public void consultar() {
         try {
         consEncNov();
         }
         catch (Exception ex) { MessageBox.Show(ex.Message); }
     }

     //Consultar materiales de la orden tipo cuero
     public void consEncNov(){
             try{

                 clases.CLSCONORD conord = new clases.CLSCONORD { NROORD_COR = orden };
                 DataTable valores = conord.conConOrdRef();
                 lisDevorden.Clear();

                 foreach (DataRow r in valores.Rows) { 
                 
                        lisDevorden.Add(new devorden{
                        orden=r["nroord_cor"].ToString(),
                        nomref=r["nomref_ref"].ToString(),
                        nomcolr=r["nomcol_eop"].ToString(),
                        canord=Convert.ToInt32(r["canord_dop"]),
                        codmat=r["codmat_cor"].ToString(),
                        desmat=r["nommat_mat"].ToString(),
                        nomcolm=r["nomcol_mat"].ToString(),
                        canent=Convert.ToDouble(r["canent_cor"]),
                         candev=Convert.ToDouble(r["candev_cor"]),
                         codref=r["codref_eop"].ToString(),
                         codcolm=r["codcol_cor"].ToString(),
                         codcolr=r["codcol_eop"].ToString(),
                        });        
                 }
                 if (lisDevorden.Count > 0) {
                     lisDevorden[0].visble = true;
                 }
     
     
             }catch(Exception ex){MessageBox.Show(ex.Message);}
     }

     //Consultar semana y fechas 
     public void consSemFec()
     {
         try
         {
             clases.CLSCALEND calend = new clases.CLSCALEND { FECHA_CAL = fecrep };
             DataTable valores = calend.consDesHasta();

             if (valores.Rows.Count > 0)
             {
                 semana = Convert.ToInt32(valores.Rows[0]["nrosem_sem"]);
                 desde = Convert.ToDateTime(valores.Rows[0]["desde_sem"]);
                 hasta = Convert.ToDateTime(valores.Rows[0]["hasta_sem"]);
             }
             else
             {
                 semana = 0;
                 desde = DateTime.Today;
                 hasta = DateTime.Today;
             }

         }
         catch (Exception ex) { MessageBox.Show(ex.Message); }
     }

     public void guardar(WrapPanel wPnot) {
         try {
      
             List<clases.CLSREPDEV> reporte = new List<clases.CLSREPDEV>();
             List<clases.CLSCONORD> consumo = new List<clases.CLSCONORD>();

             foreach (devorden r in lisDevorden) {

                 if (r.CAMBIO)
                 {
                     //El reporte
                     reporte.Add(new clases.CLSREPDEV
                     {
                         ANOSEM_RDV = fecrep.Year,
                         CANDEV_RDV = r.canadev,
                         CANENT_RDV = r.canent,
                         CODEMP_RDV = "FALTA",
                         CODMTP_RDV = r.codmat,
                         CODPRC_RDV = "DEV",
                         NROSEM_RDV = semana,
                         ORDNRO_RDV = orden,
                         PORCEN_RDV = 100
                     });

                     //Consumo
                    consumo.Add(new clases.CLSCONORD { 
                     CANDEV_COR=r.canadev,
                     CANSTA_COR=100,
                     CANENT_COR=r.canent,
                     CODCOL_COR=r.codcolm,
                     CODMAT_COR=r.codmat,
                     NROORD_COR=orden                     
                     });                        
                 }

             }


             if (new clases.CLSREPDEV().guardar(reporte, consumo) > 0)
             {
                 new MDOgeneral.notificar(wPnot, "Reporte de devolucion guardado correctamente", true);
                 consultar();
                 CAMBIO = false;

             }
             else {

                 new MDOgeneral.notificar(wPnot, "El reporte no puede ser guardado", false);
             }
         }
         catch (Exception ex) {
             MessageBox.Show(ex.Message);         
         }     
     }

     public class devorden:ObservableObject {

         private string _orden;
         public string orden {
             get { return _orden; }
             set { _orden = value;
             RaisePropertyChangedEvent("orden");
             }
         }

         private string _codref;
         public string codref{
             get { return _codref; }
             set
             {   _codref = value;
                 RaisePropertyChangedEvent("codref");
             }        
         }

         private string _nomref;
         public string nomref
         {
             get { return _nomref; }
             set
             {
                 _nomref = value;
                 RaisePropertyChangedEvent("nomref");
             }
         }

         private string _codcolr;
         public string codcolr {
             get { return _codcolr; }

             set { _codcolr = value;
             RaisePropertyChangedEvent("codcolr");
             }
         }

         private string _codcolm;
         public string codcolm
         {
             get { return _codcolm; }

             set
             {
                 _codcolm = value;
                 RaisePropertyChangedEvent("codcolm");
             }
         }

         private string _nomcolr;
         public string nomcolr
         {
             get { return _nomcolr; }

             set
             {
                 _nomcolr = value;
                 RaisePropertyChangedEvent("nomcolr");
             }
         }

         private string _nomcolm;
         public string nomcolm
         {
             get { return _nomcolm; }

             set
             {
                 _nomcolm = value;
                 RaisePropertyChangedEvent("nomcolm");
             }
         }

         private int _canord;
         public int canord {
             get { return _canord; }
             set { _canord = value;
             RaisePropertyChangedEvent("canord");
             }
         }

         private string _codmat;
         public string codmat {
             get { return _codmat; }
             set {
                 _codmat = value;
                 RaisePropertyChangedEvent("codmat");
             }
         }

         private string _desmat;
         public string desmat {
             get { return _desmat; }
             set { _desmat = value;
             RaisePropertyChangedEvent("desmat");
             }
         }

         private double _canent;
         public double canent {
             get { return _canent; }
             set { _canent = value;
             RaisePropertyChangedEvent("canent");
             }
         }

         private double _candev;
         public double candev
         {
             get { return _candev; }
             set
             {
                 _candev = value;
                 RaisePropertyChangedEvent("candev");
             }
         }

         private double _canadev;
         public double canadev
         {
             get { return _canadev; }
             set
             {
                 if (_canadev != value)
                 {
                     _canadev = value;
                     if (_canadev != 0)
                     {
                         CAMBIO = true;
                     }
                 }
                
                 RaisePropertyChangedEvent("canadev");
             }
         }

         private Boolean _CAMBIO=false;
         public Boolean CAMBIO {
             get { return _CAMBIO; }
             set { _CAMBIO = value;
             RaisePropertyChangedEvent("CAMBIO");
             }
         }


         private Boolean _visble = false;
         public Boolean visble {
             get { return _visble; }
             set { _visble = true;
             RaisePropertyChangedEvent("visble");
             }
         }
     
     }
         
    }
}


namespace ReglasValidacion
{
    //Valida que la cantidad a devolver no sea mayor que la cantidad entregada
    public class esOKcandev : ValidationRule
    {
    //      public produccion.forms.devcuero dev { get; set; }

        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            produccion.forms.devcuero dev = produccion.forms.devcuero.Instance;
            dev.ERROR = true;

            ValidationResult res;
            if (dev != null)
            {
                if (dev.indexsel != -1) { 
                

                    double candevuelta= dev.lisDevorden[dev.indexsel].canadev + dev.lisDevorden[dev.indexsel].candev;
                    double canent=dev.lisDevorden[dev.indexsel].canent;
                    if (candevuelta > canent) {
                      
                        return new ValidationResult(false,"La cantidad devuelta no puede ser mayor a la cantidad entregada.");
                    }

                    if (dev.lisDevorden[dev.indexsel].canadev <0)
                    {
              
                        return new ValidationResult(false, "La cantidad a devolver debe ser mayor que 0.");
                    }
                }
            }

            if (dev.lisDevorden[dev.indexsel].canadev != 0) {
                dev.CAMBIO = true;
            } 
         
            dev.ERROR = false;
            return new ValidationResult(true, null);
        }
    }


}